Employed dataset

Exploratory data analysis on data from Spotify about the albums and musics of Jackson do Pandeiro. The original data come from this repository. The explanation about how the data were generatedis available at the Spotify API documentation.

Considerations

In the analysis below we could:

  • See how speech was not the real core of dancability of Jackson’s songs, which was to be expected from the King of rithm.
  • See how on Spotify most albums are remastered/relaunched and those are the most popular.
  • Glimpse the incredible diversity of the singer which was reaffirmed in terms of musical notes and length.
  • Realize how tone and track duration of Jackson’s songs do not only represent the incredible diversity of his music, but also represent his private life. An event in his private life impacts sensibly the tone of his music.

Data Overview

data <- read_csv(here::here("data/jackson.csv"), 
                            col_types = cols(
                                .default = col_double(),
                                album_uri = col_character(),
                                album_name = col_character(),
                                album_img = col_character(),
                                album_release_date = col_character(),
                                album_release_year = col_date(format = ""),
                                album_popularity = col_integer(),
                                track_name = col_character(),
                                track_uri = col_character(),
                                key = col_character(),
                                mode = col_character(),
                                time_signature = col_integer(),
                                key_mode = col_character(),
                                track_popularity = col_integer()
                                )) %>%
         mutate(album_name = gsub(".*(1954).*",
                                         "The Music of Brazil/Jackson do Pandeiro",
                                  album_name));
data %>% 
    glimpse()
Observations: 500
Variables: 23
$ album_uri          <chr> "5T9tTjPIfjbUJGRJdYOOLl", "5T9tTjPIfjbUJGRJdYOOLl", "5T9tTjPIfjbUJGRJdYOOLl", "5T9tTjPIfjbUJGRJdYOOLl", ...
$ album_name         <chr> "Jackson Do Pandeiro Volume 1: Tum, Tum, Tum!", "Jackson Do Pandeiro Volume 1: Tum, Tum, Tum!", "Jackson...
$ album_img          <chr> "https://i.scdn.co/image/5dcc4a0cad740f1ee0774196d0a14f3693ef8879", "https://i.scdn.co/image/5dcc4a0cad7...
$ album_release_date <chr> "1958-11-11", "1958-11-11", "1958-11-11", "1958-11-11", "1958-11-11", "1958-11-11", "1958-11-11", "1958-...
$ album_release_year <date> 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 1958-11...
$ album_popularity   <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12,...
$ track_name         <chr> "Tum, Tum, Tum", "Pacífico Pacato", "Nortista Quatrocentão", "Sem Querer", "Vou Sambar", "Boi da Cara Pr...
$ track_uri          <chr> "6cCYhV6fU68uzbjWPG9V7x", "6Gu7y9SgtVTGh8YGhDPtCe", "1hq7M7cJtvDgQbQsgVuUAY", "7LbixXwP54FZ3CIYdT6SU6", ...
$ danceability       <dbl> 0.501, 0.663, 0.550, 0.447, 0.544, 0.571, 0.495, 0.572, 0.500, 0.579, 0.563, 0.568, 0.541, 0.565, 0.290,...
$ energy             <dbl> 0.987, 0.962, 0.947, 0.969, 0.972, 0.926, 0.967, 0.986, 0.947, 0.984, 0.985, 0.927, 0.980, 0.994, 0.934,...
$ key                <chr> "A", "F", "D", "G", "E", "F", "E", "C", "F", "A#", "E", "F", "D#", "D", "F", "G", "F", "F", "E", "C", "G...
$ loudness           <dbl> 2.561, 1.137, 1.621, 2.743, 2.513, 2.414, 2.375, 2.597, 3.078, 3.070, 2.919, 2.268, 2.470, 3.498, 1.640,...
$ mode               <chr> "major", "major", "major", "major", "minor", "major", "minor", "major", "major", "major", "major", "majo...
$ speechiness        <dbl> 0.0429, 0.1810, 0.0469, 0.0549, 0.0502, 0.0344, 0.0576, 0.0367, 0.0418, 0.0386, 0.0547, 0.0481, 0.0836, ...
$ acousticness       <dbl> 0.718, 0.738, 0.666, 0.759, 0.787, 0.651, 0.712, 0.194, 0.286, 0.312, 0.233, 0.860, 0.543, 0.287, 0.809,...
$ instrumentalness   <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
$ liveness           <dbl> 0.2820, 0.2000, 0.2510, 0.3330, 0.1760, 0.3420, 0.3210, 0.3010, 0.3230, 0.1340, 0.1190, 0.3190, 0.3040, ...
$ valence            <dbl> 0.963, 0.961, 0.923, 0.899, 0.783, 0.961, 0.755, 0.989, 0.957, 0.979, 0.963, 0.896, 0.972, 0.981, 0.597,...
$ tempo              <dbl> 101.676, 113.562, 116.125, 116.023, 112.863, 133.065, 117.822, 102.425, 110.203, 98.414, 95.766, 136.613...
$ duration_ms        <dbl> 158133, 139773, 163173, 143733, 151653, 157480, 158133, 154680, 184120, 167200, 169720, 161733, 170507, ...
$ time_signature     <int> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,...
$ key_mode           <chr> "A major", "F major", "D major", "G major", "E minor", "F major", "E minor", "C major", "F major", "A# m...
$ track_popularity   <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 3, 4, 15, 13, ...

Danceability

data %>% 
    ggplot(aes(sample=danceability)) + 
        stat_qq()

hchart (data$danceability,
        color = "#B71C1C",
        name = "Danceability")
  • No value outside expected domain, danceability seems to vary around 0.6 and 0.7.

Speechiness

data %>% 
    ggplot(aes(sample=speechiness)) + 
        stat_qq()

hchart (data$speechiness,
        color = "#B71C1C",
        name = "Speechiness")
  • No value outside expected domain. Speechiness is overall small. Observing Jackson’s music rithm seems to be its trademark, with short and almost repetitive lyrics.

Duration

data <- data %>%
    mutate(duration_s = duration_ms/1000)
data %>% 
    select(duration_s) %>%
    glimpse()
Observations: 500
Variables: 1
$ duration_s <dbl> 158.133, 139.773, 163.173, 143.733, 151.653, 157.480, 158.133, 154.680, 184.120, 167.200, 169.720, 161.733, 170....
data %>% 
    ggplot(aes(sample=duration_s)) + 
        stat_qq()

hchart (data$duration_s,
        color = "#B71C1C",
        name = "Duration (s)")
  • No value outside expected domain. Songs on average last 160 seconds (2 minutes and 40 seconds), Jackson’s songs are overall very short.

Remastered

data <- data %>%
    mutate(remastered = album_release_date > "1981-30-12")
data %>% 
    select(album_name, album_release_year, remastered) %>%
    sample_n(10)
temp <- data %>% 
    distinct(album_name,
             .keep_all = TRUE) %>%
    mutate(remastered = ifelse(remastered == TRUE,"remastered","original"))
hchart(temp$remastered,
       colorByPoint = TRUE,
       name="Álbum")
  • Remastered/Relaunched albums are very frequent.
temp <-
    data %>% 
    distinct(album_name, .keep_all = TRUE) %>%
    group_by(album_release_year) %>%
    summarise(original_n = sum(!remastered),
              remastered_n = sum(remastered))
highchart() %>%
  hc_xAxis(categories = temp$album_release_year) %>%
  hc_add_series(temp$original_n, 
                type = "column",
                color = "#B71C1C",
                name = "Not remastered") %>%
  hc_add_series(temp$remastered_n, 
                type = "column",
                name = "Remastered")  %>%
      hc_title(text = "Number of albums per year")
  • On 2016 we have a huge increase on the provision of Jackson’s albums on Spotify.

More dialog/vocals (speechines) impacts the danceability of the song?

p <- data %>% 
        distinct(track_name, .keep_all = TRUE) %>%
        ggplot(aes(x=speechiness,
                   y=danceability)) +
        geom_point(alpha=0.4) 
ggplotly(p)


There doesn’t seem to be a clear relation between the danceability of Jackson’s songs and their speechiness. We have many tracks of different levels of danceability and on the same low level of speechiness. When we increase the speechiness of the songs (more to the right of the x axis) the danceability stays relatively stable (The increase in danceability is marginal).

data %>% 
    distinct(track_name, .keep_all = TRUE) %>%
    ggplot(aes(speechiness,danceability)) +
    stat_density2d(aes(fill = ..level..), geom = "polygon") +
    scale_x_continuous(breaks = seq(0,1,0.01))


It’s possible to see more clearly that point of higher occurrences (area of highest level) is around 0.7 of danceability and 0.04 of speechiness (a very low level of speechiness). This implies something we expected, Jackson doesn’t need to talk much to make their songs highly danceable, it’s for good reason that Jackson was nicknamed the king of rithm.

  • The increase in speechiness doesn’t seem to affect danceability significantly.
  • Speechiness wouldn’t be the actual reason for the considerably danceability of Jackson’s music, who’s notorious for the beat and rithm of his songs (who was even named the best percussionist of the popular brazilian music).

How the years affect the length of the tracks?

m <- list(
  l =70,
  b = 150)
p <- data %>% 
    ggplot(aes(x=as.factor(album_release_year),
               duration_s,
               group=album_release_year,
               color=remastered)) +
    geom_boxplot(position = "dodge", alpha=0.6) +
    theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
    labs(x="Album release year", y="Track duration (s)")
ggplotly(p) %>%
     layout(autosize = F, margin=m)

Olhando para os álbuns originais (remastered = FALSE) é possível perceber um grande aumento no tempo de duração das músicas no álbum em 1967 seguido de uma diminuição no álbum seguinte 1968. Esse choque no perfil dos dois álbuns requer uma explicação que não está nos dados.

O álbum de 1967 A Braza do Norte, primeiro gravado na gravadora Cantagalo marca também um momento especial na vida do cantor, pois esse é o ano de seu divórcio de Almira, parceira na música e esposa. De músicas mais longas e de faixas de letra mais triste como “Passarinho abandonado” composta pelo próprio Jackson, esse perfil incomum do álbum acaba por refletir esse momento da vida do cantor.

O álbum de 1968 por outro lado é uma coletânea e reúne algumas das músicas até então mais populares (e tambpem curtas do cantor). Essa coletânea casa com um inaudito porém curto hiato do cantor que pela primeira vez passa um ano sem publicar um álbum, o qual pode ser atribuído ao seu divórcio.

  • Os álbuns remasterizados/relançados reúnem faixas algumas vezes de diferentes momentos da carreira do cantor, e por isso fica difícil atribuir um significado pertinente à duração de suas faixas.

Os albuns relançados/remasterizados são mais populares?

# lollipop chart
m <- list(
  l = 370)
p <- data %>%
    ggplot(aes(album_popularity,y=reorder(album_name,album_popularity),
               group=remastered)) +
    geom_segment(aes(x = 0, y = reorder(album_name,album_popularity),
                     xend = album_popularity, yend = album_name)) +
    geom_point(aes(color=remastered)) +
    theme(axis.title.y=element_blank()) +
    scale_color_discrete(" Remastered")
ggplotly(p,tooltip=NA) %>%
  layout(autosize = F,
         margin = m)

Fica evidente que para Jackson do Pandeiro os álbuns remasterizados/relançados dominam o cenário do Spotify em termos de popularidade. Primeiramente, simplesmente observando a proporção entre remasterizados e não remasterizados fica evidente que os primeiros são os que o Spotify mais disponibiliza. Segundo, levando em consideração a questão de qualidade de áudio era de se esperar que os remasterizados tomassem a dianteira.

Como o tempo afeta a distribuição das notas musicais ?

tim12equal = c("#00008F", "#0000EA", "#0047FF", "#00A2FF", "#00FEFF", "#5AFFA5", "#B5FF4A", "#FFED00", "#FF9200", "#FF3700", "#DB0000", "#800000")
m <- list(
    l=45,
    r=40);
p <-  data %>%
    select(key,album_release_date, remastered) %>%
    group_by(album_release_date,key,remastered) %>%
    summarise(counted = n()) %>%
    ungroup() %>%
    group_by(album_release_date) %>%
    mutate(rel_freq = counted/sum(counted)) %>%
    ggplot(aes(x = factor(album_release_date),
               y = rel_freq,
               fill = factor(key),
               text = paste(
                    "Proportion:",
                    round(rel_freq * 100,2),"%"))) +
    geom_col() +
    scale_y_continuous(labels = scales::percent) +
    scale_fill_manual(values = tim12equal) +
    theme(axis.text.x = element_text(angle = 30, hjust = 1))  +
    theme(axis.title.x=element_blank(),
          axis.title.y=element_blank()) +
    facet_wrap(remastered ~ ., nrow = 2) +
    ggtitle("Notas musicais (distinção por remasterização)") +
    guides(fill=guide_legend(title="Musical\nNotes")) 
ggplotly(p, tooltip="text") %>%
      layout(autosize = F,
             margin = m,
             legend = list(
      orientation = "h", y =-0.2
    )) %>%
    layout(legend = list(
      orientation = "v"
    ))
  • É possível ver que no começo dos anos 1960 ínicio as músicas na escala entre E e G dominam fortemente o repertório de Jackson, curiosamente quando as músicas de notas entre A e C chegam a ocupar metade das ocorrências.
    • Isso está de acordo com o perfil de Jackson, notório por sua heterogeneidade, além disso o álbum de 1967 como foi dito anteriormente representa uma mudança no tom do cantor também por motivos pessoais (seu divórcio).
  • Os álbuns remasterizados refletem uma grande variação em termos de notas musicais já esperada dado que esse conjuto reúne uma quase caótica série de coletâneas, seleções diversas e relançamentos que acabam misturando momentos diferentes da carreira do cantor.
    • O fato de Jackson se entregar a diversos estilos musicais śo multiplica essa variação em termos de notas musicais (Jackson se envolveu com baião, xote, xaxado, coco, arrastapé, quadrilha, marcha, frevo, e outros), isso fica evidente na variação já nos álbuns não remasterizados.
LS0tCnRpdGxlOiAiSmFja3NvbiBkbyBQYW5kZWlybyAtIFRoZSBraW5nIG9mIHJpdGhtIgpzdWJ0aXRsZTogJ0FuYWx5c2lzIHdpdGggaW50ZXJhY3RpdmUgdmlzdWFsaXphdGlvbnMgYWJvdXQgSmFja3NvbiBkbyBQYW5kZWlybyBvbiBkYXRhIGZyb20gU3BvdGlmeScKYXV0aG9yOiAiSm9zw6kgQmVuYXJkaSBkZSBTb3V6YSBOdW5lcyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgo8YnI+CgoqKioKCjxicj4KCiMjIEVtcGxveWVkIGRhdGFzZXQKCkV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgb24gZGF0YSBmcm9tIFtTcG90aWZ5XShodHRwczovL3d3dy5zcG90aWZ5LmNvbS9ici8pIGFib3V0IHRoZSBhbGJ1bXMgYW5kIG11c2ljcyBvZiBKYWNrc29uIGRvIFBhbmRlaXJvLiBUaGUgb3JpZ2luYWwgZGF0YSBjb21lIGZyb20gW3RoaXMgcmVwb3NpdG9yeV0oaHR0cHM6Ly9naXRodWIuY29tL2NpZW5jaWFkZWRhZG9zLXVmY2cvdmlzLWNhbmNvZXMpLiBUaGUgZXhwbGFuYXRpb24gYWJvdXQgaG93IHRoZSBkYXRhIHdlcmUgZ2VuZXJhdGVkaXMgYXZhaWxhYmxlIFthdCB0aGUgU3BvdGlmeSBBUEkgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9iZXRhLmRldmVsb3Blci5zcG90aWZ5LmNvbS9kb2N1bWVudGF0aW9uL3dlYi1hcGkvcmVmZXJlbmNlL29iamVjdC1tb2RlbC8jYXVkaW8tZmVhdHVyZXMtb2JqZWN0KS4KCiMjIyBDb25zaWRlcmF0aW9ucwoKSW4gdGhlIGFuYWx5c2lzIGJlbG93IHdlIGNvdWxkOgoKKiBTZWUgaG93IHNwZWVjaCB3YXMgbm90IHRoZSByZWFsIGNvcmUgb2YgZGFuY2FiaWxpdHkgb2YgSmFja3NvbidzIHNvbmdzLCB3aGljaCB3YXMgdG8gYmUgZXhwZWN0ZWQgZnJvbSB0aGUgKipLaW5nIG9mIHJpdGhtKiouCiogU2VlIGhvdyBvbiBTcG90aWZ5IG1vc3QgYWxidW1zIGFyZSByZW1hc3RlcmVkL3JlbGF1bmNoZWQgYW5kIHRob3NlIGFyZSB0aGUgbW9zdCBwb3B1bGFyLgoqIEdsaW1wc2UgdGhlIGluY3JlZGlibGUgZGl2ZXJzaXR5IG9mIHRoZSBzaW5nZXIgd2hpY2ggd2FzIHJlYWZmaXJtZWQgaW4gdGVybXMgb2YgbXVzaWNhbCBub3RlcyBhbmQgbGVuZ3RoLgoqIFJlYWxpemUgaG93IHRvbmUgYW5kIHRyYWNrIGR1cmF0aW9uIG9mIEphY2tzb24ncyBzb25ncyBkbyBub3Qgb25seSByZXByZXNlbnQgdGhlIGluY3JlZGlibGUgZGl2ZXJzaXR5IG9mIGhpcyBtdXNpYywgYnV0IGFsc28gcmVwcmVzZW50IGhpcyBwcml2YXRlIGxpZmUuIEFuIGV2ZW50IGluIGhpcyBwcml2YXRlIGxpZmUgaW1wYWN0cyBzZW5zaWJseSB0aGUgdG9uZSBvZiBoaXMgbXVzaWMuIAoKYGBge3Igc2V0dXAsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRwbHlyLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShoaWdoY2hhcnRlcikKbGlicmFyeShzdHJpbmdyKQp0aGVtZV9zZXQodGhlbWVfYncoKSkKYGBgCgojIyBEYXRhIE92ZXJ2aWV3CgpgYGB7cn0KZGF0YSA8LSByZWFkX2NzdihoZXJlOjpoZXJlKCJkYXRhL2phY2tzb24uY3N2IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IGNvbF9kb3VibGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV91cmkgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1fbmFtZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV9pbWcgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1fcmVsZWFzZV9kYXRlID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX3JlbGVhc2VfeWVhciA9IGNvbF9kYXRlKGZvcm1hdCA9ICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV9wb3B1bGFyaXR5ID0gY29sX2ludGVnZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19uYW1lID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX3VyaSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3NpZ25hdHVyZSA9IGNvbF9pbnRlZ2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X21vZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfcG9wdWxhcml0eSA9IGNvbF9pbnRlZ2VyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUKICAgICAgICAgbXV0YXRlKGFsYnVtX25hbWUgPSBnc3ViKCIuKigxOTU0KS4qIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIE11c2ljIG9mIEJyYXppbC9KYWNrc29uIGRvIFBhbmRlaXJvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX25hbWUpKTsKZGF0YSAlPiUgCiAgICBnbGltcHNlKCkKYGBgCgojIyMgRGFuY2VhYmlsaXR5CgpgYGB7cn0KZGF0YSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHNhbXBsZT1kYW5jZWFiaWxpdHkpKSArIAogICAgICAgIHN0YXRfcXEoKQpgYGAKCmBgYHtyfQpoY2hhcnQgKGRhdGEkZGFuY2VhYmlsaXR5LAogICAgICAgIGNvbG9yID0gIiNCNzFDMUMiLAogICAgICAgIG5hbWUgPSAiRGFuY2VhYmlsaXR5IikKYGBgCgoqIE5vIHZhbHVlIG91dHNpZGUgZXhwZWN0ZWQgZG9tYWluLCBkYW5jZWFiaWxpdHkgc2VlbXMgdG8gdmFyeSBhcm91bmQgMC42IGFuZCAwLjcuCgojIyMgU3BlZWNoaW5lc3MKCmBgYHtyfQpkYXRhICU+JSAKICAgIGdncGxvdChhZXMoc2FtcGxlPXNwZWVjaGluZXNzKSkgKyAKICAgICAgICBzdGF0X3FxKCkKYGBgCgpgYGB7cn0KaGNoYXJ0IChkYXRhJHNwZWVjaGluZXNzLAogICAgICAgIGNvbG9yID0gIiNCNzFDMUMiLAogICAgICAgIG5hbWUgPSAiU3BlZWNoaW5lc3MiKQpgYGAKCiogTm8gdmFsdWUgb3V0c2lkZSBleHBlY3RlZCBkb21haW4uIFNwZWVjaGluZXNzIGlzIG92ZXJhbGwgc21hbGwuIE9ic2VydmluZyBKYWNrc29uJ3MgbXVzaWMgcml0aG0gc2VlbXMgdG8gYmUgaXRzIHRyYWRlbWFyaywgIHdpdGggc2hvcnQgYW5kIGFsbW9zdCByZXBldGl0aXZlIGx5cmljcy4KCiMjIyBEdXJhdGlvbgoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICAgIG11dGF0ZShkdXJhdGlvbl9zID0gZHVyYXRpb25fbXMvMTAwMCkKCmRhdGEgJT4lIAogICAgc2VsZWN0KGR1cmF0aW9uX3MpICU+JQogICAgZ2xpbXBzZSgpCmBgYAoKCmBgYHtyfQpkYXRhICU+JSAKICAgIGdncGxvdChhZXMoc2FtcGxlPWR1cmF0aW9uX3MpKSArIAogICAgICAgIHN0YXRfcXEoKQpgYGAKCmBgYHtyfQpoY2hhcnQgKGRhdGEkZHVyYXRpb25fcywKICAgICAgICBjb2xvciA9ICIjQjcxQzFDIiwKICAgICAgICBuYW1lID0gIkR1cmF0aW9uIChzKSIpCmBgYAoKKiBObyB2YWx1ZSBvdXRzaWRlIGV4cGVjdGVkIGRvbWFpbi4gU29uZ3Mgb24gYXZlcmFnZSBsYXN0IDE2MCBzZWNvbmRzICgyIG1pbnV0ZXMgYW5kIDQwIHNlY29uZHMpLCBKYWNrc29uJ3Mgc29uZ3MgYXJlIG92ZXJhbGwgdmVyeSBzaG9ydC4KCiMjIyBSZW1hc3RlcmVkCgpgYGB7cn0KZGF0YSA8LSBkYXRhICU+JQogICAgbXV0YXRlKHJlbWFzdGVyZWQgPSBhbGJ1bV9yZWxlYXNlX2RhdGUgPiAiMTk4MS0zMC0xMiIpCgpkYXRhICU+JSAKICAgIHNlbGVjdChhbGJ1bV9uYW1lLCBhbGJ1bV9yZWxlYXNlX3llYXIsIHJlbWFzdGVyZWQpICU+JQogICAgc2FtcGxlX24oMTApCmBgYAoKCmBgYHtyfQp0ZW1wIDwtIGRhdGEgJT4lIAogICAgZGlzdGluY3QoYWxidW1fbmFtZSwKICAgICAgICAgICAgIC5rZWVwX2FsbCA9IFRSVUUpICU+JQogICAgbXV0YXRlKHJlbWFzdGVyZWQgPSBpZmVsc2UocmVtYXN0ZXJlZCA9PSBUUlVFLCJyZW1hc3RlcmVkIiwib3JpZ2luYWwiKSkKCmhjaGFydCh0ZW1wJHJlbWFzdGVyZWQsCiAgICAgICBjb2xvckJ5UG9pbnQgPSBUUlVFLAogICAgICAgbmFtZT0iw4FsYnVtIikKYGBgCgoqIFJlbWFzdGVyZWQvUmVsYXVuY2hlZCBhbGJ1bXMgYXJlIHZlcnkgZnJlcXVlbnQuCgpgYGB7cn0KdGVtcCA8LQogICAgZGF0YSAlPiUgCiAgICBkaXN0aW5jdChhbGJ1bV9uYW1lLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUKICAgIGdyb3VwX2J5KGFsYnVtX3JlbGVhc2VfeWVhcikgJT4lCiAgICBzdW1tYXJpc2Uob3JpZ2luYWxfbiA9IHN1bSghcmVtYXN0ZXJlZCksCiAgICAgICAgICAgICAgcmVtYXN0ZXJlZF9uID0gc3VtKHJlbWFzdGVyZWQpKQoKaGlnaGNoYXJ0KCkgJT4lCgogIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSB0ZW1wJGFsYnVtX3JlbGVhc2VfeWVhcikgJT4lCiAgaGNfYWRkX3Nlcmllcyh0ZW1wJG9yaWdpbmFsX24sIAogICAgICAgICAgICAgICAgdHlwZSA9ICJjb2x1bW4iLAogICAgICAgICAgICAgICAgY29sb3IgPSAiI0I3MUMxQyIsCiAgICAgICAgICAgICAgICBuYW1lID0gIk5vdCByZW1hc3RlcmVkIikgJT4lCiAgaGNfYWRkX3Nlcmllcyh0ZW1wJHJlbWFzdGVyZWRfbiwgCiAgICAgICAgICAgICAgICB0eXBlID0gImNvbHVtbiIsCiAgICAgICAgICAgICAgICBuYW1lID0gIlJlbWFzdGVyZWQiKSAgJT4lCiAgICAgIGhjX3RpdGxlKHRleHQgPSAiTnVtYmVyIG9mIGFsYnVtcyBwZXIgeWVhciIpCgpgYGAKCiogT24gMjAxNiB3ZSBoYXZlIGEgaHVnZSBpbmNyZWFzZSBvbiB0aGUgcHJvdmlzaW9uIG9mIEphY2tzb24ncyBhbGJ1bXMgb24gU3BvdGlmeS4KCiMjIE1vcmUgZGlhbG9nL3ZvY2FscyAoc3BlZWNoaW5lcykgaW1wYWN0cyB0aGUgZGFuY2VhYmlsaXR5IG9mIHRoZSBzb25nPwoKYGBge3J9CnAgPC0gZGF0YSAlPiUgCiAgICAgICAgZGlzdGluY3QodHJhY2tfbmFtZSwgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgICAgICAgZ2dwbG90KGFlcyh4PXNwZWVjaGluZXNzLAogICAgICAgICAgICAgICAgICAgeT1kYW5jZWFiaWxpdHkpKSArCiAgICAgICAgZ2VvbV9wb2ludChhbHBoYT0wLjQpIAoKZ2dwbG90bHkocCkKYGBgCgo8YnI+PC9icj4KClRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGNsZWFyIHJlbGF0aW9uIGJldHdlZW4gdGhlIGRhbmNlYWJpbGl0eSBvZiBKYWNrc29uJ3Mgc29uZ3MgYW5kIHRoZWlyIHNwZWVjaGluZXNzLiBXZSBoYXZlIG1hbnkgdHJhY2tzIG9mIGRpZmZlcmVudCBsZXZlbHMgb2YgZGFuY2VhYmlsaXR5IGFuZCBvbiB0aGUgc2FtZSBsb3cgbGV2ZWwgb2Ygc3BlZWNoaW5lc3MuIApXaGVuIHdlIGluY3JlYXNlIHRoZSBzcGVlY2hpbmVzcyBvZiB0aGUgc29uZ3MgKG1vcmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSB4IGF4aXMpIHRoZSBkYW5jZWFiaWxpdHkgc3RheXMgcmVsYXRpdmVseSBzdGFibGUgKFRoZSBpbmNyZWFzZSBpbiBkYW5jZWFiaWxpdHkgaXMgbWFyZ2luYWwpLgoKYGBge3J9CmRhdGEgJT4lIAogICAgZGlzdGluY3QodHJhY2tfbmFtZSwgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHNwZWVjaGluZXNzLGRhbmNlYWJpbGl0eSkpICsKICAgIHN0YXRfZGVuc2l0eTJkKGFlcyhmaWxsID0gLi5sZXZlbC4uKSwgZ2VvbSA9ICJwb2x5Z29uIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDEsMC4wMSkpCgpgYGAKCjxicj48L2JyPgoKSXQncyBwb3NzaWJsZSB0byBzZWUgbW9yZSBjbGVhcmx5IHRoYXQgcG9pbnQgb2YgaGlnaGVyIG9jY3VycmVuY2VzIChhcmVhIG9mIGhpZ2hlc3QgbGV2ZWwpIGlzIGFyb3VuZCAwLjcgb2YgZGFuY2VhYmlsaXR5IGFuZCAwLjA0IG9mIHNwZWVjaGluZXNzIChhIHZlcnkgbG93IGxldmVsIG9mIHNwZWVjaGluZXNzKS4gClRoaXMgaW1wbGllcyBzb21ldGhpbmcgd2UgZXhwZWN0ZWQsIEphY2tzb24gZG9lc24ndCBuZWVkIHRvIHRhbGsgbXVjaCB0byBtYWtlIHRoZWlyIHNvbmdzIGhpZ2hseSBkYW5jZWFibGUsIGl0J3MgZm9yIGdvb2QgcmVhc29uIHRoYXQgSmFja3NvbiB3YXMgbmlja25hbWVkICoqdGhlIGtpbmcgb2Ygcml0aG0qKi4KCiogVGhlIGluY3JlYXNlIGluIHNwZWVjaGluZXNzIGRvZXNuJ3Qgc2VlbSB0byBhZmZlY3QgZGFuY2VhYmlsaXR5IHNpZ25pZmljYW50bHkuCiogU3BlZWNoaW5lc3Mgd291bGRuJ3QgYmUgdGhlIGFjdHVhbCByZWFzb24gZm9yIHRoZSBjb25zaWRlcmFibHkgZGFuY2VhYmlsaXR5IG9mIEphY2tzb24ncyBtdXNpYywgd2hvJ3Mgbm90b3Jpb3VzIGZvciB0aGUgYmVhdCBhbmQgcml0aG0gb2YgaGlzIHNvbmdzICh3aG8gd2FzIGV2ZW4gbmFtZWQgdGhlIGJlc3QgcGVyY3Vzc2lvbmlzdCBvZiB0aGUgcG9wdWxhciBicmF6aWxpYW4gbXVzaWMpLiAKCiMjIEhvdyB0aGUgeWVhcnMgYWZmZWN0IHRoZSBsZW5ndGggb2YgdGhlIHRyYWNrcz8KCmBgYHtyfQptIDwtIGxpc3QoCiAgbCA9NzAsCiAgYiA9IDE1MCkKCnAgPC0gZGF0YSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9YXMuZmFjdG9yKGFsYnVtX3JlbGVhc2VfeWVhciksCiAgICAgICAgICAgICAgIGR1cmF0aW9uX3MsCiAgICAgICAgICAgICAgIGdyb3VwPWFsYnVtX3JlbGVhc2VfeWVhciwKICAgICAgICAgICAgICAgY29sb3I9cmVtYXN0ZXJlZCkpICsKICAgIGdlb21fYm94cGxvdChwb3NpdGlvbiA9ICJkb2RnZSIsIGFscGhhPTAuNikgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxKSkgKwogICAgbGFicyh4PSJBbGJ1bSByZWxlYXNlIHllYXIiLCB5PSJUcmFjayBkdXJhdGlvbiAocykiKQoKZ2dwbG90bHkocCkgJT4lCiAgICAgbGF5b3V0KGF1dG9zaXplID0gRiwgbWFyZ2luPW0pCmBgYAoKT2xoYW5kbyBwYXJhIG9zIMOhbGJ1bnMgb3JpZ2luYWlzIChyZW1hc3RlcmVkID0gRkFMU0UpIMOpIHBvc3PDrXZlbCBwZXJjZWJlciB1bSBncmFuZGUgYXVtZW50byBubyB0ZW1wbyBkZSBkdXJhw6fDo28gZGFzIG3DunNpY2FzIG5vIMOhbGJ1bSBlbSAxOTY3IHNlZ3VpZG8gZGUgdW1hIGRpbWludWnDp8OjbyBubyDDoWxidW0gc2VndWludGUgMTk2OC4gRXNzZSBjaG9xdWUgbm8gcGVyZmlsIGRvcyBkb2lzIMOhbGJ1bnMgcmVxdWVyIHVtYSBleHBsaWNhw6fDo28gcXVlIG7Do28gZXN0w6Egbm9zIGRhZG9zLgoKTyDDoWxidW0gZGUgMTk2NyAqKkEgQnJhemEgZG8gTm9ydGUqKiwgcHJpbWVpcm8gZ3JhdmFkbyBuYSBncmF2YWRvcmEgQ2FudGFnYWxvIG1hcmNhIHRhbWLDqW0gdW0gbW9tZW50byBlc3BlY2lhbCBuYSB2aWRhIGRvIGNhbnRvciwgcG9pcyBlc3NlIMOpIG8gYW5vIGRlIHNldSBkaXbDs3JjaW8gZGUgQWxtaXJhLCBwYXJjZWlyYSBuYSBtw7pzaWNhIGUgZXNwb3NhLiBEZSBtw7pzaWNhcyBtYWlzIGxvbmdhcyBlIGRlIGZhaXhhcyBkZSBsZXRyYSBtYWlzIHRyaXN0ZSBjb21vICoqIlBhc3NhcmluaG8gYWJhbmRvbmFkbyIqKiBjb21wb3N0YSBwZWxvIHByw7NwcmlvIEphY2tzb24sIGVzc2UgcGVyZmlsIGluY29tdW0gZG8gw6FsYnVtIGFjYWJhIHBvciByZWZsZXRpciBlc3NlIG1vbWVudG8gZGEgdmlkYSBkbyBjYW50b3IuCgpPIMOhbGJ1bSBkZSAxOTY4IHBvciBvdXRybyBsYWRvIMOpIHVtYSBjb2xldMOibmVhIGUgcmXDum5lIGFsZ3VtYXMgZGFzIG3DunNpY2FzIGF0w6kgZW50w6NvIG1haXMgcG9wdWxhcmVzIChlIHRhbWJwZW0gY3VydGFzIGRvIGNhbnRvcikuIEVzc2EgY29sZXTDom5lYSBjYXNhIGNvbSB1bSBpbmF1ZGl0byBwb3LDqW0gY3VydG8gaGlhdG8gZG8gY2FudG9yIHF1ZSBwZWxhIHByaW1laXJhIHZleiBwYXNzYSB1bSBhbm8gc2VtIHB1YmxpY2FyIHVtIMOhbGJ1bSwgbyBxdWFsIHBvZGUgc2VyIGF0cmlidcOtZG8gYW8gc2V1IGRpdsOzcmNpby4KCiogT3Mgw6FsYnVucyByZW1hc3Rlcml6YWRvcy9yZWxhbsOnYWRvcyByZcO6bmVtIGZhaXhhcyBhbGd1bWFzIHZlemVzIGRlIGRpZmVyZW50ZXMgbW9tZW50b3MgZGEgY2FycmVpcmEgZG8gY2FudG9yLCBlIHBvciBpc3NvIGZpY2EgZGlmw61jaWwgYXRyaWJ1aXIgdW0gc2lnbmlmaWNhZG8gcGVydGluZW50ZSDDoCBkdXJhw6fDo28gZGUgc3VhcyBmYWl4YXMuIAoKCiMjIE9zIGFsYnVucyByZWxhbsOnYWRvcy9yZW1hc3Rlcml6YWRvcyBzw6NvIG1haXMgcG9wdWxhcmVzPyAKCmBgYHtyfQojIGxvbGxpcG9wIGNoYXJ0Cm0gPC0gbGlzdCgKICBsID0gMzcwKQoKcCA8LSBkYXRhICU+JQogICAgZ2dwbG90KGFlcyhhbGJ1bV9wb3B1bGFyaXR5LHk9cmVvcmRlcihhbGJ1bV9uYW1lLGFsYnVtX3BvcHVsYXJpdHkpLAogICAgICAgICAgICAgICBncm91cD1yZW1hc3RlcmVkKSkgKwogICAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMCwgeSA9IHJlb3JkZXIoYWxidW1fbmFtZSxhbGJ1bV9wb3B1bGFyaXR5KSwKICAgICAgICAgICAgICAgICAgICAgeGVuZCA9IGFsYnVtX3BvcHVsYXJpdHksIHllbmQgPSBhbGJ1bV9uYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3I9cmVtYXN0ZXJlZCkpICsKICAgIHRoZW1lKGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCkpICsKICAgIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKCIgUmVtYXN0ZXJlZCIpCgpnZ3Bsb3RseShwLHRvb2x0aXA9TkEpICU+JQogIGxheW91dChhdXRvc2l6ZSA9IEYsCiAgICAgICAgIG1hcmdpbiA9IG0pCmBgYAoKRmljYSBldmlkZW50ZSBxdWUgcGFyYSBKYWNrc29uIGRvIFBhbmRlaXJvICoqb3Mgw6FsYnVucyByZW1hc3Rlcml6YWRvcy9yZWxhbsOnYWRvcyBkb21pbmFtIG8gY2Vuw6FyaW8gZG8gU3BvdGlmeSBlbSB0ZXJtb3MgZGUgcG9wdWxhcmlkYWRlKiouIApQcmltZWlyYW1lbnRlLCBzaW1wbGVzbWVudGUgb2JzZXJ2YW5kbyBhIHByb3BvcsOnw6NvIGVudHJlIHJlbWFzdGVyaXphZG9zIGUgbsOjbyByZW1hc3Rlcml6YWRvcyBmaWNhIGV2aWRlbnRlIHF1ZSBvcyBwcmltZWlyb3Mgc8OjbyBvcyBxdWUgbyBTcG90aWZ5IG1haXMgZGlzcG9uaWJpbGl6YS4gU2VndW5kbywgbGV2YW5kbyBlbSBjb25zaWRlcmHDp8OjbyBhIHF1ZXN0w6NvIGRlIHF1YWxpZGFkZSBkZSDDoXVkaW8gZXJhIGRlIHNlIGVzcGVyYXIgcXVlIG9zIHJlbWFzdGVyaXphZG9zIHRvbWFzc2VtIGEgZGlhbnRlaXJhLgoKIyMgQ29tbyBvIHRlbXBvIGFmZXRhIGEgZGlzdHJpYnVpw6fDo28gZGFzIG5vdGFzIG11c2ljYWlzID8KCmBgYHtyfQp0aW0xMmVxdWFsID0gYygiIzAwMDA4RiIsICIjMDAwMEVBIiwgIiMwMDQ3RkYiLCAiIzAwQTJGRiIsICIjMDBGRUZGIiwgIiM1QUZGQTUiLCAiI0I1RkY0QSIsICIjRkZFRDAwIiwgIiNGRjkyMDAiLCAiI0ZGMzcwMCIsICIjREIwMDAwIiwgIiM4MDAwMDAiKQoKCm0gPC0gbGlzdCgKICAgIGw9NDUsCiAgICByPTQwKTsKCnAgPC0gIGRhdGEgJT4lCiAgICBzZWxlY3Qoa2V5LGFsYnVtX3JlbGVhc2VfZGF0ZSwgcmVtYXN0ZXJlZCkgJT4lCiAgICBncm91cF9ieShhbGJ1bV9yZWxlYXNlX2RhdGUsa2V5LHJlbWFzdGVyZWQpICU+JQogICAgc3VtbWFyaXNlKGNvdW50ZWQgPSBuKCkpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgZ3JvdXBfYnkoYWxidW1fcmVsZWFzZV9kYXRlKSAlPiUKICAgIG11dGF0ZShyZWxfZnJlcSA9IGNvdW50ZWQvc3VtKGNvdW50ZWQpKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGZhY3RvcihhbGJ1bV9yZWxlYXNlX2RhdGUpLAogICAgICAgICAgICAgICB5ID0gcmVsX2ZyZXEsCiAgICAgICAgICAgICAgIGZpbGwgPSBmYWN0b3Ioa2V5KSwKICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKAogICAgICAgICAgICAgICAgICAgICJQcm9wb3J0aW9uOiIsCiAgICAgICAgICAgICAgICAgICAgcm91bmQocmVsX2ZyZXEgKiAxMDAsMiksIiUiKSkpICsKICAgIGdlb21fY29sKCkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gdGltMTJlcXVhbCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxKSkgICsKICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpKSArCiAgICBmYWNldF93cmFwKHJlbWFzdGVyZWQgfiAuLCBucm93ID0gMikgKwogICAgZ2d0aXRsZSgiTm90YXMgbXVzaWNhaXMgKGRpc3RpbsOnw6NvIHBvciByZW1hc3Rlcml6YcOnw6NvKSIpICsKICAgIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZCh0aXRsZT0iTXVzaWNhbFxuTm90ZXMiKSkgCgpnZ3Bsb3RseShwLCB0b29sdGlwPSJ0ZXh0IikgJT4lCiAgICAgIGxheW91dChhdXRvc2l6ZSA9IEYsCiAgICAgICAgICAgICBtYXJnaW4gPSBtLAogICAgICAgICAgICAgbGVnZW5kID0gbGlzdCgKICAgICAgb3JpZW50YXRpb24gPSAiaCIsIHkgPS0wLjIKICAgICkpICU+JQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoCiAgICAgIG9yaWVudGF0aW9uID0gInYiCiAgICApKQoKYGBgCgoqIMOJIHBvc3PDrXZlbCB2ZXIgcXVlIG5vIGNvbWXDp28gZG9zIGFub3MgMTk2MCDDrW5pY2lvIGFzIG3DunNpY2FzIG5hIGVzY2FsYSBlbnRyZSBFIGUgRyBkb21pbmFtIGZvcnRlbWVudGUgbyByZXBlcnTDs3JpbyBkZSBKYWNrc29uLCBjdXJpb3NhbWVudGUgcXVhbmRvIGFzIG3DunNpY2FzIGRlIG5vdGFzIGVudHJlIEEgZSBDIGNoZWdhbSBhIG9jdXBhciBtZXRhZGUgZGFzIG9jb3Jyw6puY2lhcy4gICAKICAgICsgSXNzbyBlc3TDoSBkZSBhY29yZG8gY29tIG8gcGVyZmlsIGRlIEphY2tzb24sIG5vdMOzcmlvIHBvciBzdWEgaGV0ZXJvZ2VuZWlkYWRlLCBhbMOpbSBkaXNzbyBvIMOhbGJ1bSBkZSAxOTY3IGNvbW8gZm9pIGRpdG8gYW50ZXJpb3JtZW50ZSByZXByZXNlbnRhIHVtYSBtdWRhbsOnYSBubyB0b20gZG8gY2FudG9yIHRhbWLDqW0gcG9yIG1vdGl2b3MgcGVzc29haXMgKHNldSBkaXbDs3JjaW8pLiAgCiAqIE9zIMOhbGJ1bnMgcmVtYXN0ZXJpemFkb3MgcmVmbGV0ZW0gdW1hIGdyYW5kZSB2YXJpYcOnw6NvIGVtIHRlcm1vcyBkZSBub3RhcyBtdXNpY2FpcyBqw6EgZXNwZXJhZGEgZGFkbyBxdWUgZXNzZSBjb25qdXRvIHJlw7puZSB1bWEgcXVhc2UgY2HDs3RpY2Egc8OpcmllIGRlIGNvbGV0w6JuZWFzLCBzZWxlw6fDtWVzIGRpdmVyc2FzIGUgcmVsYW7Dp2FtZW50b3MgcXVlIGFjYWJhbSBtaXN0dXJhbmRvIG1vbWVudG9zIGRpZmVyZW50ZXMgZGEgY2FycmVpcmEgZG8gY2FudG9yLiAgCiAgICArIE8gZmF0byBkZSBKYWNrc29uIHNlIGVudHJlZ2FyIGEgZGl2ZXJzb3MgZXN0aWxvcyBtdXNpY2FpcyDFm28gbXVsdGlwbGljYSBlc3NhIHZhcmlhw6fDo28gZW0gdGVybW9zIGRlIG5vdGFzIG11c2ljYWlzIChKYWNrc29uIHNlIGVudm9sdmV1IGNvbSBiYWnDo28sIHhvdGUsIHhheGFkbywgY29jbywgYXJyYXN0YXDDqSwgcXVhZHJpbGhhLCBtYXJjaGEsIGZyZXZvLCAqKmUgb3V0cm9zKiopLCBpc3NvIGZpY2EgZXZpZGVudGUgbmEgdmFyaWHDp8OjbyBqw6Egbm9zIMOhbGJ1bnMgbsOjbyByZW1hc3Rlcml6YWRvcy4K